package org.nobject.common.js;

import java.lang.reflect.Array;
import java.util.Collection;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;

import org.nobject.common.exception.ConvertException;
import org.nobject.common.lang.ClassUtils;
import org.nobject.common.lang.ObjectUtils;
import org.nobject.common.lang.StringUtils;

/**
 * JSON数组类
 * 以List的形式存储数据
 * 提供常用类型数据的操作方法
 * 	add(o) 添加值
 *  getXXX(idx) 获取值
 *  toXXX 转换
 *
 * @author bianrongjun
 * @version 1.0
 */
public class JSONArray {
	
	/** 数据集合 */
	private List list;
	
	/**
	 * 构造函数 
	 * @param str JSON字符串
	 * @throws ConvertException 
	 */
	public JSONArray(String str) throws  ConvertException{
		this(JSONUtils.toList(str));
	}
	
	/**
	 * 构造函数 
	 * @param list List
	 */
	public JSONArray(List list){
		this.list=list;
	}
	
	/**
	 * 构造函数 
	 * @param os 数组
	 */
	public JSONArray(Object[] os){
		list=new LinkedList();
		for (int i = 0; i < os.length; i++) {
			list.add(os[i]);
		}
	}
	
	/**
	 * 构造函数 
	 */
	public JSONArray(){
		this.list=new LinkedList();
	}
	
	/******************************************************************************************************************
	 * 
	 *  Get 区域
	 * 
	 *******************************************************************************************************************/
	
	/** 获取String值 */
	public String getString(int idx)		{return StringUtils.toString0(list.get(idx));}
	/** 获取int值 */
	public int getInt(int idx)				{return (Integer)list.get(idx);}
	/** 获取double值 */
	public double getDouble(int idx)		{return (Double)list.get(idx);}
	/** 获取boolean值 */
	public boolean getBoolean(int idx)		{return (Boolean)list.get(idx);}
	/** 获取List值 */
	public List getList(int idx)			{return (List)list.get(idx);}
	/** 获取Map值 */
	public Map getMap(int idx)				{return (Map)list.get(idx);}
	/** 获取JSONArray */
	public JSONArray getJSONArray(int idx)	{
		Object o=list.get(idx);
		if(o instanceof List){
			return new JSONArray((List)o);
		}
		return (JSONArray)o;
	}
	/**  获取JSONObject */
	public JSONObject getJSONObject(int idx){
		Object o=list.get(idx);
		if(o instanceof Map){
			return new JSONObject((Map)o);
		}
		return (JSONObject)o;
	}
	/**  获取JSONObject */
	public Object getObject(int idx)		{return list.get(idx);}
	
	/******************************************************************************************************************
	 * 
	 *  To 区域
	 * 
	 *******************************************************************************************************************/
	
	/** 转换为String */
	public String toString(){return JSONUtils.toString(list);}
	/** 转换为指定类型  */
	public Object[] toOjects(Class clazz) throws ConvertException{return ObjectUtils.toObjects(list.toArray(), clazz);}
	/** 转换为指定类型组实例  */
	public Object[] toOjects(Class[] clazzes) throws ConvertException{return ObjectUtils.toObjects(list.toArray(), clazzes);}
	/** 
	 * Object转化为JSONArray<br>
	 * 支持数组、Collection、JSON字符串的方式转换
	 * @throws ConvertException 
	 */
	public static JSONArray toJSONArray(Object obj) throws ConvertException{
		if(obj==null) return null;
		Class clazz=obj.getClass();
		if(clazz.equals(JSONArray.class)) return (JSONArray)obj;
		if(clazz.isArray()){
			List list=new LinkedList();
			int l=Array.getLength(obj);
			for (int i = 0; i < l; i++) list.add(Array.get(list, i));
			return new JSONArray(list);
		}else{
			if(ClassUtils.isString(clazz)) return new JSONArray((String)obj);
			else if(ClassUtils.isList(clazz)) return new JSONArray((List)obj);
			else if(ClassUtils.isCollection(clazz)){
				List l=new LinkedList();
				l.addAll((Collection)obj);
				return new JSONArray(l);
			}else throw new ConvertException("不支持到JSONArray的转换:"+clazz.getName());
		}
	}
	
	/** 拥有值 */
	public int length(){return this.list.size();}
	
	/** 添加元素 */
	public void add(String o){this.list.add(o);}
	/** 添加元素 */
	public void add(int o){this.list.add(o);}
	/** 添加元素 */
	public void add(double o){this.list.add(o);}
	/** 添加元素 */
	public void add(boolean o){this.list.add(o);}
	/** 添加元素 */
	public void add(JSONArray o){this.list.add(o);}
	/** 添加元素 */
	public void add(JSONObject o){this.list.add(o);}
	/** 添加元素 */
	public void _add(Object o){this.list.add(o);}
	
	/** 插入元素 */
	public void add(int idx,String o){this.list.add(idx,o);}
	/** 插入元素 */
	public void add(int idx,int o){this.list.add(idx,o);}
	/** 插入元素 */
	public void add(int idx,double o){this.list.add(idx,o);}
	/** 插入元素 */
	public void add(int idx,boolean o){this.list.add(idx,o);}
	/** 插入元素 */
	public void add(int idx,JSONArray o){this.list.add(idx,o);}
	/** 插入元素 */
	public void add(int idx,JSONObject o){this.list.add(idx,o);}
	
	/** 删除元素  */
	public void remove(int idx){this.list.remove(idx);}
	/** 删除元素  */
	public void removeObject(Object o){this.list.remove(o);}
	
	/** 
	 * toList
	 * @return
	 */
	public List toList(){
		return this.list;
	}
	
	/** 
	 * 获取长度
	 */
	public int size()	{ return this.list.size();}
}
